package ricky.utils
{
	import flash.events.Event;
	import flash.geom.Point;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.utils.ByteArray;
	import flash.utils.Dictionary;
	import flash.utils.describeType;
	import flash.utils.getDefinitionByName;
	
	import ricky.game.Actor;
	
	public class Utils
	{
		
		public function Utils()
		{
		}
		
		/**
		 * 得到文件名
		 */
		public static function getURLFileName(url:*):String
		{
//			return url;
			if(url is String)
			{
				var re:String = "";
				var len:* = url.length - 1;
				while (len >= 0 && url.charAt(len) != "/" && url.charAt(len) != "\\")
	  				len = len - 1;
				var sub:* = (url.length - 1) - len;
				if (sub> 0)
					re = url.substring((len + 1), url.length);
				return re;
			}else
			{
				url.position=20;
				return url.readMultiByte(40,"iso-8859-1");
			}
		}
		
		/**
		 * 得到文件后缀
		 */
		public static function getURLFileType(url:String):String
		{
			var lend:int=url.lastIndexOf(".");
			var str:String=url.substring(lend+1,url.length);
			var wend:int=str.indexOf("?");
			if(wend==-1)
				return str;
			else
				return str.substr(0,wend);
		}
		
		/**
		 * 解压文本为对象返回Dictionary对象
		 */
		public static function decompressionClassDic(data:*,key:String="",className:Class=null,proRow:Boolean=true):Dictionary
		{
			var g:Object;//对像
			var dis:XMLList=null;
			if(className!=null)
				dis=describeType(new className).accessor;
			//生成对像
			var rows:Array=data.split("\r\n");//所有行
			var property:Array=rows[1].split("\t");//第二行
			
			var columns:Array;//列
			var dic:Dictionary=new Dictionary();
			var p:String;//属性
			var c:String;//值
			var t:String;//类型
			var accessor:*;//访问器
			var rowStri:String;
			
			for(var i:int=2;i<rows.length;i++)
			{
				rowStri=rows[i];
				if(rowStri.indexOf("//")!=-1 || rowStri=="")
					continue;
				
				columns=rowStri.split("\t");
				if(className==null)
					g=new Object();
				else
					g=new className();
				
				for (var j:int=0;j<property.length;j++)
				{
					if(j<columns.length)
						c=columns[j];
					else
						c="";
					if(proRow)
						p=property[j];
					else
						p=j+"";
					
					if(dis!=null)//如果有描述
					{
						accessor=dis.(@name==p);
						if(accessor)
						{
							t=accessor.@type;//类型
							if(t=="*")
								t="Object";
							else if(t=="")
								g[p]=c;
							else
								g[p]=flash.utils.getDefinitionByName(t)(c);
						}
						else
							g[p]=c;
					}
					else
						g[p]=c;
					
				}	
				dic[g[key]]=g;
			}
			
			return dic;
		}
		
		/**
		 * 解压文本为对象
		 */
		public static function decompression(data:*,className:Class=null):Array
		{
			var g:Object;//对像
			var dis:XMLList=null;
			if(className!=null)
				dis=describeType(new className).accessor;
			//生成对像
			var rows:Array=data.split("\r\n");//所有行
			var property:Array=rows[1].split("\t");//第二行
			var columns:Array;//列
			var _guide:Array=new Array();
			var p:String;//属性
			var c:String;//值
			var t:String;//类型
			var accessor:*;//访问器
			var rowStri:String;
			for(var i:int=2;i<rows.length;i++)
			{
				rowStri=rows[i];
				if(rowStri.indexOf("\\\\")!=-1)
					continue;
				
				columns=rowStri.split("\t");
				if(className==null)
					g=new Object();
				else
					g=new className();
				
				for (var j:int=0;j<property.length;j++)
				{
					if(j<columns.length)
						c=columns[j];
					else
						c="";
					p=property[j];

					if(dis!=null)//如果有描述
					{
						accessor=dis.(@name==p);
						if(accessor)
						{
							t=accessor.@type;//类型
							if(t=="*")
								t="Object";
							g[p]=flash.utils.getDefinitionByName(t)(c);
						}
						else
							g[p]=c;
					}
					else
						g[p]=c;
					
				}	
				_guide.push(g);
			}
			
			return _guide;
		}

		/**
		 * 两点间的格子数
		 */
		public static function gridDistance(x1:Number,y1:Number,x2:Number,y2:Number):int
		{
			var p11:Point=new Point(x1/Common.tileWidth,y1/Common.tileHeight);
			var p22:Point=new Point(x2/Common.tileWidth,y2/Common.tileHeight);
			return	Point.distance(p11,p22);
		}
		
		/**
		 * 两点间的距离
		 */
		public static function gridDistance1(gridx1:Number,gridy1:Number,gridx2:Number,gridy2:Number):int
		{
			var p11:Point=new Point(gridx1,gridy1);
			var p22:Point=new Point(gridx2,gridy2);
			return	Point.distance(p11,p22);
		}
		
//			
//		/**
//		 * 两点间的距离
//		 */
//		public static function distance(x1:Number,y1:Number,x2:Number,y2:Number):Number
//		{
//			var dis:Number=	(x2-x1)*(x2-x1)+ (y2-y1)*(y2-y1);
//			return	Math.sqrt(dis);
//		}
//		
//		/**
//		 * 判断一个点是否在一个区域之内
//		 */
//		public static function checkPointInarea(px:Number,py:Number,x:Number,y:Number,width:Number,height:Number):Boolean
//		{
//			if(px>x && px<(x+width) && py>y && py<(y+height))
//				return true;
//			else
//				return false;
//		}
		
		/**
		 * 点坐标到格子坐标
		 */
		public static function pointToGrid(x:Number,y:Number):Array
		{
			return new Array(int(y/Common.tileHeight),int(x/Common.tileWidth));//x列 y行
		}
		
		/**
		 * 格子坐标到点坐标
		 * (行，列)
		 */
		public static function gridToPoint(i:int,j:int):Point
		{
			return new Point(j*Common.tileWidth,i*Common.tileHeight);
		}
		
		/**
		 * 
		 * 计算方向
		 */
		public static function calcDirection(obj:Actor,point:Object):int
		{
			var dx:Number=point.x-obj.graphic.x;
			var dy:Number=point.y-obj.graphic.y;
			var angle:Number=Math.atan2(dy,dx);//角度
			var _dir:int=4;
			if((angle<=0.17452 && angle>0) || (-0.17452<=angle && angle<0)  )//右  10 -10
				_dir=2;
			else if(angle>0.17452 && angle<= 1.39616)//右下10 80
				_dir=3;
			else if(angle>1.39616 && angle<=1.7452)//下80 100
				_dir=4;
			else if(angle>1.7452 && angle<=2.96684)//左下100 170
				_dir=5;
			else if(angle>2.96684  || angle<=-2.96684)//左 170 -170 
				_dir=6;
			else if(angle>-2.96684 && angle<=-1.7452)//左上 -170 -100; 
				_dir=7;
			else if(angle>-1.7452 && angle<=-1.39616)//上 -100 -80
				_dir=0;
			else if(angle>-1.39616 && angle<-0.17452)//右上 -80 -10
				_dir=1;
			
			return _dir;
		}
		
		/**
		 * 
		 * 得到da模型的url 不需要加文件后缀
		 * 默认为网站的根目录
		 * 
		 */
		public static function getModelUrl(modelPath:String):String
		{
			return modelPath+".da";
		}
		
		
		/**
		 * copy样式
		 */
		public static function copyObject(source:*,target:*):void
		{
			var s:XML=describeType(source);
			var v:*;
			if(s.@isDynamic=="true")
			{
				for(var i:* in source)
				{
					try{
						v=source[i];
						if(v || v==undefined)
							target[i]=v;
					}catch(e:*){trace(e);}//end try
				}//end for
			}
			else
			{
				var pre:String=s..accessor.@name.toXMLString();
				var arr:Array=pre.split('\n');
				var p:String;
				for(var n:String in arr)
				{
					p=arr[n];
					try{
						v=source[p];
						if(v || v==undefined)
							target[p]=v;
					}catch(e:*){trace(e);}//end try
				}//end for
			}//end if isDynamic
		}
	}
}